package com.hliushi.learn.utils;

import com.hliushi.learn.config.MicroServiceUrl;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * @author llhuang10
 * @date 2021/7/21 21:05
 */
public class PropertiesUtils {

    private static MicroServiceUrl bean;
    private static StringRedisTemplate stringRedisTemplate;

    static {
        // 注意 变量想在静态代码块中赋值或初始化, 那么这个变量一定是静态变量!!!
        // 经过这个静态代码块, PropertiesUtils工具类中的 静态成员变量 bean 和 stringRedisTemplate能被注入值
        ApplicationContext applicationContext = SpringApplicationContextUtils.getApplicationContext();
        bean = applicationContext.getBean(MicroServiceUrl.class);
        stringRedisTemplate = applicationContext.getBean(StringRedisTemplate.class);
    }

    /**
     * 注意不能为静态变量, 使用依赖注入, 因为IOC容器是依赖set方法, 而set方法是实例对象的方法,
     * 注入依赖时无法注入静态成员变量的, 在调用的时候依赖的Bean才会为null
     */
    // @Resource
    // public static AuditProperties auditProperties;

    /**
     * 私有构造器, 不允许该类被实例化
     */
    private PropertiesUtils() {
    }


    /**
     * 注意, 调用该类的静态方法时 [如PropertiesUtils.getMicroServiceUrl], 不会走这个构造器,
     * 也就说 bean | stringRedisTemplate 这些静态变量没有被赋值或初始化, 导致后面为空
     * 一般来说, 工具类的是不能被实例化的, 也就说一些变量的初始化过程可以放到static静态代码块来做
     */
    // public PropertiesUtils() {
    //     ApplicationContext applicationContext = SpringApplicationContextUtils.getApplicationContext();
    //     bean = applicationContext.getBean(MicroServiceUrl.class);
    //     stringRedisTemplate = applicationContext.getBean(StringRedisTemplate.class);
    // }
    public static MicroServiceUrl getMicroServiceUrl() {
        return bean;
    }

    public static StringRedisTemplate getRedisTemplate() {
        return stringRedisTemplate;
    }
}
